package br.com.monise.controll;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import br.com.monise.dao.ArtigoParceiroDao;
import br.com.monise.dao.ArtigoUsuarioDao;
import br.com.monise.dao.CaracteristicasDao;
import br.com.monise.dao.CaracteristicasParceiroDao;
import br.com.monise.dao.CaracteristicasUsuarioDao;
import br.com.monise.dao.HistoricoAvaliacaoDao;
import br.com.monise.dao.ItemCaracteristicaDao;
import br.com.monise.dao.ParceiroDao;
import br.com.monise.model.ArtigoParceiro;
import br.com.monise.model.ArtigosUsuario;
import br.com.monise.model.Caracteristicas;
import br.com.monise.model.CaracteristicasParceiro;
import br.com.monise.model.CaracteristicasUsuario;
import br.com.monise.model.HistoricoDeAvaliacao;
import br.com.monise.model.Parceiro;
import br.com.monise.model.Usuario;
import br.com.monise.model.UsuarioArtigoPK;

public class PerfilDeGrupo {
	
	Logger log = Logger.getLogger("br.com.perfil"); 
	CaracteristicasDao caracteristicasDao = new CaracteristicasDao();
	ItemCaracteristicaDao itemsDao = new ItemCaracteristicaDao();
	CaracteristicasParceiroDao caracteristicaParceiroDao = new CaracteristicasParceiroDao();
	CaracteristicasUsuarioDao caracteristicasUsuarioDao = new CaracteristicasUsuarioDao();
	private List<ArtigoParceiro> artigosRelaventes = new ArrayList<ArtigoParceiro>();
	
	private void getArtigosRelevanesParceiro(Parceiro parceiro, Usuario usuario){		
		List<ArtigoParceiro> artigosParceiro = new ArrayList<ArtigoParceiro>();
		ArtigoParceiroDao artigoParceiroDao = new ArtigoParceiroDao();
		
		artigosParceiro = artigoParceiroDao.getArtigosParceiro(parceiro);
		
		for(ArtigoParceiro artigoParceiro : artigosParceiro){
			if((artigoParceiro.getAvaliacao().compareTo(usuario.getPatamarArtigo()) >= 0)  && (!artigoLidoUsuario(artigoParceiro)) && (!artigoJaRecomendado(artigoParceiro, usuario))){
				artigosRelaventes.add(artigoParceiro);
			}
		}
	}
	
	private boolean artigoJaRecomendado(ArtigoParceiro artigoParceiro, Usuario usuario){
		HistoricoAvaliacaoDao historicoDao = new HistoricoAvaliacaoDao();
		HistoricoDeAvaliacao historicoAvalicao = new HistoricoDeAvaliacao();
		
		UsuarioArtigoPK usuarioArtigoPk = new UsuarioArtigoPK();
		usuarioArtigoPk.setArtigoParceiro(artigoParceiro.getPkAtigoParceiro());
		usuarioArtigoPk.setUsuario(usuario.getPkUsuario());
		
		historicoAvalicao = historicoDao.consultarPorId(usuarioArtigoPk);
		
		if(historicoAvalicao==null){
			return false;
		}
		return true;
	}
	
	private boolean artigoLidoUsuario(ArtigoParceiro artigoParceiro){
		
		List<ArtigosUsuario> artigosUsuarios = new ArrayList<ArtigosUsuario>();
		ArtigoUsuarioDao artigoUsuarioDao = new ArtigoUsuarioDao();
		
		try {
			artigosUsuarios = artigoUsuarioDao.getAll();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		for(ArtigosUsuario artigo : artigosUsuarios){
			if(artigo.getArtigo().getTitulo().equals(artigoParceiro.getArtigo().getTitulo())){
				return true;
			}
		}
		return false;
	}
	
	public List<ArtigoParceiro> getArtigosRelevantes(List<Parceiro> parceirosSimilares, Usuario usuario){
		for(Parceiro parceiro : parceirosSimilares){
			getArtigosRelevanesParceiro(parceiro, usuario);
		}
		
		return artigosRelaventes;
	}
	
	public List<Parceiro> calculo(Usuario administrador) throws Exception{
		ParceiroDao parceiroDao = new ParceiroDao();
		List<Parceiro> parceiros = parceiroDao.getAll();
		List<Parceiro> parceirosSimilares = new ArrayList<Parceiro>();
		
		for(Parceiro parceiro : parceiros){
			Parceiro similar = new Parceiro();

			System.out.println();
			log.info("Parceiro: " + parceiro.getNome());
						
			similar = calculoCaracteristica(parceiro, administrador);
			
			if(similar!=null){
				log.info("Similar: " + similar.getNome());
				parceirosSimilares.add(similar);
			}
			
			System.out.println();
		}
		
		return parceirosSimilares;
	}
	
	public Parceiro calculoCaracteristica(Parceiro parceiro, Usuario adm){
		List<Caracteristicas> caracteristicas = new ArrayList<Caracteristicas>();
		
		try {
			caracteristicas = caracteristicasDao.getAll();
		} catch (Exception e) {
			e.printStackTrace();
			log.warning(e.getMessage());
		}
		
		CaracteristicasParceiro ctParceiro = new CaracteristicasParceiro();
		CaracteristicasUsuario ctUsuario = new CaracteristicasUsuario();

		Double soma = new Double(0);
		
		for(Caracteristicas caracteristica : caracteristicas){	
			BigDecimal maisPatamar = new BigDecimal(0), menosPatamar = new BigDecimal(0), wk= new BigDecimal(0);

			ctParceiro = caracteristicaParceiroDao.getCaracteristicasParceiro(caracteristica, parceiro);
			ctUsuario = caracteristicasUsuarioDao.getCaracteristicasUsuario(caracteristica, adm);

			log.info("Caracteristica: " +  caracteristica.getNome());
			log.info("Margem caracteristica: " + caracteristica.getMargemComparacao());
			
			maisPatamar = (caracteristica.getMargemComparacao().add(ctUsuario.getItensCaracteristicas().getValor()));
			menosPatamar = (ctUsuario.getItensCaracteristicas().getValor().subtract(caracteristica.getMargemComparacao()));
			
			log.info("Maior patamar : " + maisPatamar);
			log.info("Menos patamar : " + menosPatamar);
			
			log.info("valor caract. usuario: " + ctUsuario.getItensCaracteristicas().getValor());
			log.info("valor caract. parceiro: " + ctParceiro.getItensCaracteristicas().getValor() );
			
			if(ctUsuario.getItensCaracteristicas().getValor().compareTo(ctParceiro.getItensCaracteristicas().getValor()) == 0){
				wk = new BigDecimal(1);
				log.info("WK igual " + wk);
			} 
			else
			  if(((ctParceiro.getItensCaracteristicas().getValor().compareTo(menosPatamar)) >= 0 )  || ((ctParceiro.getItensCaracteristicas().getValor().compareTo(maisPatamar)) <= 0 )) {

					  if((ctParceiro.getItensCaracteristicas().getValor().compareTo(ctUsuario.getItensCaracteristicas().getValor())) <= -1 ){
						  wk = ctParceiro.getItensCaracteristicas().getValor();
						  log.info("WK menor valor parceiro " + wk);
					  }else{
						  wk = ctUsuario.getItensCaracteristicas().getValor();
						  log.info("WK patamar valor usuario " + wk);
					  }
			  }
			  else{
				  wk = new BigDecimal(0);
				  log.info("WK diferente " + wk);
			  }
			
			System.out.println();
			wk =  wk.multiply(caracteristica.getPeso());
			log.info("Valor soma: " + wk.doubleValue());
			soma = soma + wk.doubleValue();
		}
				
		BigDecimal novo = adm.getPatamarUsuario();
		novo = novo.subtract(new BigDecimal(0.75));

		log.info("Soma " + soma.doubleValue());
		log.info("Patamar de similaridade ADM: " + adm.getPatamarUsuario());

		if(soma >= adm.getPatamarUsuario().doubleValue()){
			return parceiro;
		}
		else{
			return null;
		}
	}
}
